     /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.fina.mbean;

import com.brain.come.dto.DocumentoVentaDto;
import com.brain.conf.dto.MonedaDto;
import com.brain.conf.manager.MonedaManager;
import com.brain.core.common.ExportarExcelFinanzas;
import com.brain.core.common.ExportarExcelFinanzas.FinanciamientoLetra;
import com.brain.core.common.UtilCore;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.ArchivoMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.fina.dto.FinanciamientoLetraDto;
import com.brain.fina.dto.LetraDto;
import com.brain.fina.manager.FinanciamientoManager;
import com.brain.fina.manager.LetraManager;
import com.brain.fina.view.util.ConstantesFina;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.event.DateSelectEvent;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Controller("financiamientoLetraMBean")
@Scope("session")
public class FinanciamientoLetraMBean extends GenericMBean implements Serializable {

    /**
     * Guarda las acciones del sistema en un archivo de texto plano
     *
     * @since 09/01/2014
     */
    private static Logger logger = Logger.getLogger(FinanciamientoLetraMBean.class);
    /**
     * Objeto que permite el acceso a la capa de datos de la clase
     * FinanciamientoLetraManager
     *
     * @since 09/01/2014
     */
    @Resource
    private FinanciamientoManager managerFinanciamientoLetra;
    /**
     * Objeto que permite el acceso a la capa de datos de la clase LetraManager
     *
     * @since 09/01/2014
     */
    @Resource
    private LetraManager managerLetra;
    /**
     * Objeto que permite el acceso a la capa de datos de la clase ManagerMoneda
     *
     * @since 09/01/2014
     */
    @Resource
    private MonedaManager managerMoneda;
    /**
     * objeto de tipo lista de la clase FinanciamientoLetraDto
     *
     * @since 09/01/2014
     */
    private List<FinanciamientoLetraDto> lista;
    /**
     * objeto de tipo lista de la clase LetraDto (Detalle de la entidad)
     *
     * @since 09/01/2014
     */
    private List<LetraDto> listaCobros;
    /**
     * objeto de la clase FinanciamientoLetraDto
     *
     * @since 09/01/2014
     */
    private FinanciamientoLetraDto dto;
    /**
     * objeto de la clase FinanciamientoLetraDto
     *
     * @since 09/01/2014
     */
    private FinanciamientoLetraDto dtoFiltro;
    /**
     * objeto de Arreglo de Items
     *
     * @since 09/01/2014
     */
    private SelectItem[] siEstados;
    /**
     * objeto de Arreglo de Items
     *
     * @since 09/01/2014
     */
    private SelectItem[] siEstadosBusqueda;
    /**
     * objeto de tipo lista de la clase MonedaDto
     *
     * @since 09/01/2014
     */
    private List<MonedaDto> siMonedas;
    /**
     * objeto de tipo lista de la clase ParametroDto
     *
     * @since 09/01/2014
     */
    private List<ParametroDto> siEstadosCobros;
    /**
     * objeto de la clase LetraDto (Detalle de la entidad)
     *
     * @since 09/01/2014
     */
    private LetraDto letraDto;
    /**
     * objeto de la clase DocumentoVentaDto
     *
     * @since 09/01/2014
     */
    private DocumentoVentaDto documentoVentaDto;
    /**
     * titulo del formulario
     *
     * @since 09/01/2014
     */
    private String keyTitulo = "form.financiamiento.panel";
    /**
     * objeto de la clase ApplicationMBean , acceso a la clase utilitaria de
     * configuración
     *
     * @since 09/01/2014
     */
    @Autowired
    private ApplicationMBean applicationMBean;
    /**
     * objeto de la clase SessionMBean
     *
     * @since 09/01/2014
     */
    @Autowired
    private SessionMBean sessionMBean;
    /**
     * Objeto de la clase RecursosManager (acceso a metodos utilitarios)
     *
     * @since 09/01/2014
     */
    @Resource
    private RecursosManager recursosManager;
    /**
     * Objeto de la clase ArchivoMBean (acceso a metodos utilitarios para crear
     * y personalizar archivos)
     *
     * @since 09/01/2014
     */
    @Resource
    private ArchivoMBean archivoMBean;
    /**
     * objeto de tipo lista de la clase LetraDto (Detalle de la entidad)
     *
     * @since 09/01/2014
     */
    private List<LetraDto> letrasAntiguas;
    /**
     * booleano que indica si es agente de retención
     *
     * @since 09/01/2014
     */
    public boolean aRetencion;
    /**
     * arreglo de la clase FinancinanciamientoLetraDto que servirá para indicar
     * que valores se exportarán al doc. Excel
     *
     * @since 09/01/2014
     */
    private FinanciamientoLetraDto[] selectedFLs;
    /**
     * objeto de la clase ExportarExcelFinanzas.FinanciamientoLetra
     *
     * @since 09/01/2014
     */
    private ExportarExcelFinanzas.FinanciamientoLetra flExcel;
    /**
     * cadena que indica que tipo de documento de Excel se va a exportar
     *
     * @since 09/01/2014
     */
    private String tipoXls;
    /**
     * objeto booleano que indica que filas de una lista se han seleccionado ,
     * para poder exportarlas
     *
     * @since 09/01/2014
     */
    private Boolean checkExcel;

    /**
     * Metodo que permite instanciar todos los objetos al iniciar el formulario
     *
     * @since 09/01/2014
     */
    public String iniciar() {
        this.dtoFiltro = new FinanciamientoLetraDto();
        this.dtoFiltro.setEstado(ConstantesFina.ValoresConstantes.FINA_LETRA_COD_ESTADO_TODOS);
        this.lista = null;
        this.dtoFiltro.setFechaInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.flExcel = new ExportarExcelFinanzas.FinanciamientoLetra(true);
        this.selectedFLs = null;
        return managerFinanciamientoLetra.getUrlLista();
    }

    /**
     * calcula el porcentaje que se coloca en el campo Porcentaje de retencion
     *
     * @since 09/01/2014
     */
    public void calcularAgenteRetencion() {


        if (this.dto.getEsAgenteRetencion().booleanValue() == Boolean.TRUE || !this.dto.getPorcentajeRetencion().equals(0)) {
            aRetencion = true;
        }
        if (this.dto.getPorcentajeRetencion() != null) {
            this.dto.setMontoRetencion((this.dto.getPorcentajeRetencion().multiply(this.dto.getPrecioBien())).divide(BigDecimal.valueOf(100)));
            this.dto.setSaldoRetencion(this.dto.getPrecioBien().subtract(this.dto.getMontoRetencion()));
        }
        calcularCuota();
    }

    /**
     * Metodo que permite buscar todos los registros de la clase
     * FinanciamientoLetraDto
     *
     * @since 09/01/2014
     */
    public void buscar(ActionEvent ae) {
        try {
            this.lista = managerFinanciamientoLetra.obtenerFinanciamientos(dtoFiltro);

        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    /**
     * Metodo que setea los valores del dto y construye el formulario para crear
     * un nuevo registro
     *
     * @since 09/01/2014
     * @return retorna la url de la nueva pagina
     */
    public String nuevoDto() throws DAOException {

        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.dto = new FinanciamientoLetraDto();
        this.dto.setEstado(ConstantesFina.ValoresConstantes.FINA_LETRA_COD_ESTADO_ELABORACION);
        this.dto.setComentario("NUEVO FINANCIAMIENTO");
        this.dto.setLugarGiro("CENTRAL");
        this.dto.setImpuestoVenta(sessionMBean.getOrganizacionDto().getPaisDto().getImpuestoVentas());
        this.dto.setMonedaDto(managerMoneda.obtenerPorId(ConstantesCore.ValoresDefecto.MONEDA_DEFECTO));
        this.dto.setFechaGiro(UtilCore.Fecha.obtenerFechaActualDate());
        this.dto.setPrecioBien(BigDecimal.ZERO);
        this.dto.setInicial(BigDecimal.ZERO);
        this.dto.setTea(BigDecimal.valueOf(16));
        this.dto.setIntervaloDiasCuota(Long.valueOf(30));
        this.dto.setNumeroPeriodosLetra(Long.valueOf(6));
        this.dto.setPeriodoGracia(Long.valueOf(0));
        this.dto.setPrintCuotasIguales(Boolean.TRUE);
        this.dto.setPorcentajeRetencion(BigDecimal.ZERO);
        this.dto.setMontoRetencion(BigDecimal.ZERO);
        this.dto.setSaldoRetencion(BigDecimal.ZERO);
        this.dto.setEsAgenteRetencion(Boolean.FALSE);
        this.dto.setListaLetras(new ArrayList<LetraDto>());
        this.documentoVentaDto = null;
        return managerFinanciamientoLetra.getUrl();
    }

    /**
     * Metodo que permite cargar los valores de un dto existente y construye el
     * formulario para editar un registro
     *
     * @since 09/01/2014
     * @return retorna la url de la pagina de editado
     */
    public String editarDto() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.letrasAntiguas = this.dto.getListaLetras();
        return managerFinanciamientoLetra.getUrl();
    }

    /**
     * Metodo que permite imprimir los valores existentes de un dto seleccionado
     * Se exportan todos los detalles asociados al dto seleccionado (Letras)
     *
     * @since 09/01/2014
     * @return retorna un valor vacio
     */
    public String imprimirDto() {

        try {
            String nombreArchivoReporte = "FINANCIAMIENTO_NRO_" + this.dto.getId();
            HashMap parametros = new HashMap();
            parametros.put("P_ID_FINANCIAMIENTO", BigDecimal.valueOf(this.dto.getId()));
            recursosManager.viewReportePdf(parametros, "FinanciamientoLetra", nombreArchivoReporte);
        } catch (FileNotFoundException ex) {
            showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }

    }

    /**
     * Metodo que permite imprimir los valores existentes de un dto seleccionado
     * Se exporta el resumen del financiamiento actual
     *
     * @since 09/01/2014
     * @return retorna un valor vacio
     */
    public String imprimirDtoResumen() {

        try {
            String nombreArchivoReporte = "RESUMEN_FINANCIAMIENTO_NRO_" + this.dto.getId();
            HashMap parametros = new HashMap();
            parametros.put("P_ID_FINANCIAMIENTO", BigDecimal.valueOf(this.dto.getId()));
            recursosManager.viewReportePdf(parametros, "FinanciamientoLetraResumen", nombreArchivoReporte);
        } catch (FileNotFoundException ex) {
            showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }

    }

    /**
     * Metodo que permite llenar el formulario dependiendo de un valor (dto)
     * seleccionado
     *
     * @since 09/01/2014
     * @param event objeto de la clase SelectEvent , evento que permitirá
     * seleccionar un valor
     */
    public void documentoVentaSelect(SelectEvent event) {
        try {

            this.documentoVentaDto = (DocumentoVentaDto) event.getObject();
            this.dto.setDocumentoVentaDto(this.documentoVentaDto);
            this.dto.setMonedaDto(this.documentoVentaDto.getMonedaDto());
            this.dto.setGirado(this.documentoVentaDto.getClienteDto().getDescripcion());
            this.dto.setDomicilioGirado(this.documentoVentaDto.getClienteDto().getDireccion());
            this.dto.setDoiGirado(this.documentoVentaDto.getClienteDto().getNumeroDocumento());
            this.dto.setTelefonoGirado(this.documentoVentaDto.getClienteDto().getDireccion());
            this.dto.setPrecioBien(this.documentoVentaDto.getTotal());
            calcularSaldoFinanciar();
        } catch (Exception ex) {
            logger.error(ex);
        }
    }

    /**
     * Metodo que permite ver los datos existentes de un dto , sin opción a
     * editar o modificar algún valor
     *
     * @since 09/01/2014
     * @return retorna la url de la pagina de financiamientoLetra
     */
    public String verDto() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        return managerFinanciamientoLetra.getUrl();
    }

    /**
     * Metodo que permite gestionar las acciones DML del objeto dto de la clase
     * FinanciamientoLetraDto
     *
     * @since 09/01/2014
     * @return retorna la url de la pagina de financiamientoLetra o ún valor
     * nulo en caso pase un error
     */
    public String guardar() {
        String ir = "";
        String mensajeTrx = "";
        Long idDto = null;

        this.dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        this.dto.setTerminal(sessionMBean.getSessionTerminal());
        this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());


        if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
            this.dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
            this.dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
            this.dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
            try {
                UtilCore.General.toUpperCaseDto(this.dto);
                UtilCore.General.redondearNumerosDto(this.dto, applicationMBean.getPrecisionDecimales());
                this.managerFinanciamientoLetra.nuevo(this.dto);
                ir = "";
            } catch (Exception ex) {
                logger.error(ex.getMessage());
                System.out.println(ex.getMessage());
                ir = null;
            }
        } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
            try {
                UtilCore.General.toUpperCaseDto(this.dto);
                UtilCore.General.redondearNumerosDto(this.dto, applicationMBean.getPrecisionDecimales());
                this.managerFinanciamientoLetra.editar(this.dto);
                this.managerLetra.eliminarLista(this.letrasAntiguas);
                ir = "";
            } catch (Exception e) {
                logger.error(e);
                ir = null;
            }
        }

        if (ir != null) {
            buscar(null);
            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
            showMessage(mensajeTrx);
            ir = managerFinanciamientoLetra.getUrlLista();
        } else {
            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.error");
            showError(mensajeTrx);
            ir = null;
        }
        return ir;
    }

    /**
     * Metodo que permite generar en memoria, detalles de la clase
     * FinanciamientoLetraDto (Letras)
     *
     * @since 09/01/2014
     */
    void generarLetras() {
        BigDecimal maf = BigDecimal.ZERO;
        int precision = applicationMBean.getPrecisionDecimales();
        this.dto.setListaLetras(null);
        List<LetraDto> listaLetras = new ArrayList<LetraDto>();
        this.dto.setListaLetras(listaLetras);
        if (dto.getEsAgenteRetencion() == Boolean.FALSE) {
            maf = this.dto.getNuevoSaldoFinanciar();
        } else {
            maf = this.dto.getSaldoRetencion();
        }
        Date fechaPrimerVencimiento = UtilCore.Fecha.agregarDiasFechaDate(this.dto.getFechaGiro(), this.dto.getPeriodoGracia().intValue());
        Double tIntereses = new Double(0);
        int prox = 0;
        BigDecimal totalNominal = BigDecimal.valueOf(0);
        for (Long i = Long.valueOf(0); i <= this.dto.getNumeroPeriodosLetra().longValue(); i++) {
            letraDto = new LetraDto();
            letraDto.setNumero(Long.valueOf(i));
            if (i.equals(Long.valueOf(0))) {
                letraDto.setCuota(BigDecimal.ZERO);
                if (dto.getEsAgenteRetencion() == Boolean.FALSE) {
                    letraDto.setSaldo(this.dto.getNuevoSaldoFinanciar());
                    letraDto.setInteres(this.dto.getNuevoSaldoFinanciar().subtract(this.dto.getSaldoFinanciar()));
                } else {
                    letraDto.setSaldo(this.dto.getSaldoRetencion());
                    letraDto.setInteres(this.dto.getSaldoFinanciar().subtract(this.dto.getSaldoFinanciar()));
                }

                letraDto.setAmortizacion(BigDecimal.ZERO);
                letraDto.setImpuestoVentaInteres((this.dto.getImpuestoVenta().multiply(letraDto.getInteres())).divide(BigDecimal.valueOf(100)));
                letraDto.setValorNominal(letraDto.getCuota().add(letraDto.getImpuestoVentaInteres()));
                letraDto.setTotal(letraDto.getCuota().add(letraDto.getImpuestoVentaInteres()));
                letraDto.setFechaVencimiento(this.dto.getFechaGiro());

                letraDto.setFinanciamientoLetraDto(this.dto);
                letraDto.setEstado(ConstantesFina.ValoresConstantes.LETRA_ESTADO_COD_DEFAULT);
                this.dto.getListaLetras().add(letraDto);

            } else {
                letraDto.setCuota(this.dto.getCuotaIgual());
                letraDto.setInteres(this.dto.getTeEspecial().multiply((maf).divide(BigDecimal.valueOf(100), precision)));
                letraDto.setAmortizacion(letraDto.getCuota().subtract(letraDto.getInteres()));
                letraDto.setImpuestoVentaInteres((this.dto.getImpuestoVenta().multiply(letraDto.getInteres())).divide(BigDecimal.valueOf(100)));
                letraDto.setValorNominal(letraDto.getCuota().add(letraDto.getImpuestoVentaInteres()));
                letraDto.setTotal(letraDto.getCuota().add(letraDto.getImpuestoVentaInteres()));
                maf = maf.subtract(letraDto.getAmortizacion());
                letraDto.setSaldo(maf);
                letraDto.setEstado(ConstantesFina.ValoresConstantes.LETRA_ESTADO_COD_DEFAULT);
                prox = this.dto.getIntervaloDiasCuota().intValue() * i.intValue();
                Date vencimiento = UtilCore.Fecha.agregarDiasFechaDate(fechaPrimerVencimiento, prox);
                letraDto.setFechaVencimiento(vencimiento);

                letraDto.setFinanciamientoLetraDto(this.dto);
                this.dto.getListaLetras().add(letraDto);
                if (i.equals(this.dto.getNumeroPeriodosLetra().longValue())) {
                    letraDto.setSaldo(new BigDecimal(0));
                }
            }
            tIntereses += letraDto.getInteres().doubleValue();
            totalNominal = totalNominal.add(letraDto.getValorNominal());
        }

        this.dto.setTotalInteres(BigDecimal.valueOf(tIntereses));
        for (LetraDto l : this.dto.getListaLetras()) {

            if (l.getNumero().equals(Long.valueOf(0))) {
                l.setCuotaIgual(BigDecimal.ZERO);
            } else {
                UtilCore.General.redondearNumerosDto(l, precision);
                l.setTotalLetras(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(l.getValorNominal().floatValue(), this.dto.getMonedaDto().getDescripcion()));
                l.setCuotaIgual(UtilCore.Numero.dividir(totalNominal, this.dto.getNumeroPeriodosLetra(), precision));
                l.setCuotaIgualLetras(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(l.getCuotaIgual().floatValue(), this.dto.getMonedaDto().getDescripcion()));
            }
        }
    }

    /**
     * Metodo que permite retroceder , del formulario actual . A la lista de
     * búsqueda
     *
     * @since 09/01/2014
     * @return retorna la url de la pagina de busqueda de la clase
     * FinanciamientoLetraDto
     */
    public String retroceder() {
        buscar(null);
        return managerFinanciamientoLetra.getUrlLista();
    }

    /**
     * Metodo que permite calcular el saldo a financiar
     *
     * @since 09/01/2014
     *
     */
    public void calcularSaldoFinanciar() {
        this.dto.setSaldoFinanciar(this.dto.getPrecioBien().subtract(this.dto.getInicial()));
        calcularNuevoSaldoFinanciar();
        calcularAgenteRetencion();
    }

    /**
     * Metodo que permite calcular el nuevo saldo a financiar , cuando se
     * seleccionar un valor del doc. venta (campo autocompletable)
     *
     * @since 09/01/2014
     *
     */
    public void calcularNuevoSaldoFinanciar() {
        Double tea = 0.00;
        //Calculamos la tasa
        if (dto.getTea().equals(BigDecimal.valueOf(0))) {
            tea = BigDecimal.valueOf(0.00000000001).doubleValue();
        } else {
            tea = this.dto.getTea().doubleValue() / new Double(100);
        }

        Double inter2 = new Double(30) / new Double(360);
        Double tem = Math.pow(1 + tea, inter2) - 1;

        this.dto.setTem(BigDecimal.valueOf(tem).multiply(BigDecimal.valueOf(100)));
        Double inter1 = this.dto.getIntervaloDiasCuota().doubleValue() / new Double(30);
        Double tee = Math.pow(1 + tem, inter1) - 1;
        this.dto.setTeEspecial(BigDecimal.valueOf(tee).multiply(BigDecimal.valueOf(100)));
        BigDecimal inter = UtilCore.Numero.dividir(this.dto.getPeriodoGracia(), 30L, applicationMBean.getPrecisionDecimales());

        Double tasa = Math.pow(1 + this.dto.getTem().doubleValue() / new Double(100), inter.doubleValue());

        this.dto.setNuevoSaldoFinanciar(BigDecimal.valueOf(tasa).multiply(this.dto.getSaldoFinanciar()));
        calcularTasas();
    }

    /**
     * Metodo que permite calcular la tasa del financiamiento actual
     *
     * @since 09/01/2014
     */
    public void calcularTasas() {
        Double tee = 0.001;
        Double tea = this.dto.getTea().doubleValue() / new Double(100);
        Double inter = new Double(30) / new Double(360);
        Double tem = Math.pow(1 + tea, inter) - 1;
        this.dto.setTem(BigDecimal.valueOf(tem).multiply(BigDecimal.valueOf(100)));
        Double inter1 = this.dto.getIntervaloDiasCuota().doubleValue() / new Double(30);

        if (this.dto.getTem().equals(BigDecimal.valueOf(0).setScale(1))) {
            tee = BigDecimal.valueOf(0.00000001).doubleValue();
        } else {
            tee = Math.pow(1 + tem, inter1) - 1;
        }

        this.dto.setTeEspecial(BigDecimal.valueOf(tee).multiply(BigDecimal.valueOf(100)));
        calcularCuota();
    }

    /**
     * Metodo que permite calcular la cuota del financiamiento actual
     *
     * @since 09/01/2014
     *
     */
    public void calcularCuota() {
        Double cuota = 0.00;
        Double iTasa = 0.00;

        if (dto.getTeEspecial().equals(BigDecimal.valueOf(0))) {
            iTasa = BigDecimal.valueOf(0.00000000001).doubleValue();
        } else {
            iTasa = this.dto.getTeEspecial().doubleValue() / new Double(100);
        }
        if (this.dto.getEsAgenteRetencion().booleanValue() == false) {
            cuota = this.dto.getNuevoSaldoFinanciar().doubleValue() * (iTasa * Math.pow((1 + iTasa), this.dto.getNumeroPeriodosLetra().doubleValue())) / (Math.pow((1 + iTasa), this.dto.getNumeroPeriodosLetra().doubleValue()) - 1);

        } else {
            System.out.println(Math.pow((1 + iTasa), this.dto.getNumeroPeriodosLetra().doubleValue()) - 1);
            cuota = this.dto.getSaldoRetencion().doubleValue() * (iTasa * Math.pow((1 + iTasa), this.dto.getNumeroPeriodosLetra().doubleValue())) / (Math.pow((1 + iTasa), this.dto.getNumeroPeriodosLetra().doubleValue()) - 1);

        }
        System.out.println(cuota);
        this.dto.setCuotaIgual(BigDecimal.valueOf(cuota));
        generarLetras();
    }

    /**
     * Metodo que permite modificar la fecha del giro de la letra
     *
     * @since 09/01/2014
     *
     */
    public void cambiarFechaGiro(DateSelectEvent e) {
        this.dto.setFechaGiro(e.getDate());
        calcularSaldoFinanciar();
    }

    /**
     * Metodo que permite seleccionar los valores de la lista a exportar (Filas)
     *
     * @since 09/01/2014
     */
    private void generarExcelSeleccionadosFinanciamientoLetra() {
        this.managerFinanciamientoLetra.generarExcelSeleccionados(flExcel, selectedFLs);
    }

    /**
     * Metodo que permite exportar los valores de toda la busqueda de la tabla
     *
     * @since 09/01/2014
     *
     */
    private void generarExcelPorTablaFinanciamientoLetra() {
        this.managerFinanciamientoLetra.generarExcelPorTabla(flExcel, lista);
    }

    /**
     * Metodo que permite exportar los valores seleccionados a un documento de
     * excel
     *
     * @since 09/01/2014
     *
     */
    public void exportarExcel() {
        if (this.tipoXls.equals("T")) {
            generarExcelPorTablaFinanciamientoLetra();
        } else if (this.tipoXls.equals("S")) {
            generarExcelSeleccionadosFinanciamientoLetra();
        }
    }

    /**
     * Metodo que permite cargar valores a un nuevo pop-up donde , se
     * seleccionarán valores a exportar
     *
     * @since 09/01/2014
     *
     */
    public void cargarPopupExportarExcel(String tipo) {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        this.tipoXls = tipo;
        if (tipo.equals("T")) {
            if (lista.isEmpty()) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.financiamiento.letra"));
            }
        } else if (tipo.equals("S")) {

            if (selectedFLs.length <= 0) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.financiamiento.letra"));
            }
        }
        if (resultado) {
            this.flExcel = new ExportarExcelFinanzas.FinanciamientoLetra(true);
            this.checkExcel = Boolean.TRUE;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    /**
     * Metodo que permite seleccionar un valor de el pop-up , para después
     * exportarlo
     *
     * @since 09/01/2014
     *
     */
    public void onChangeChekExcel() {
        this.flExcel = managerFinanciamientoLetra.onChangeChekExcel(checkExcel);
    }

    /**
     * Metodo que permite autocompletar una lista de documentos de venta
     *
     * @since 09/01/2014
     * @param query datos digitados por el usuario que facilitan la busqueda de
     * un registro
     * @return retorna una lista de documentos de venta
     */
    public List<DocumentoVentaDto> autoCompletarDocumentosVentas(String query) {
        return managerFinanciamientoLetra.listaDocumentosVentas(query);
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public DocumentoVentaDto getDocumentoVentaDto() {
        return documentoVentaDto;
    }

    public void setDocumentoVentaDto(DocumentoVentaDto documentoVentaDto) {
        this.documentoVentaDto = documentoVentaDto;
    }

    public FinanciamientoLetraDto getDto() {
        return dto;
    }

    public void setDto(FinanciamientoLetraDto dto) {
        this.dto = dto;
    }

    public FinanciamientoLetraDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(FinanciamientoLetraDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public LetraDto getLetraDto() {
        return letraDto;
    }

    public void setLetraDto(LetraDto letraDto) {
        this.letraDto = letraDto;
    }

    public List<FinanciamientoLetraDto> getLista() {
        return lista;
    }

    public void setLista(List<FinanciamientoLetraDto> lista) {
        this.lista = lista;
    }

    public List<LetraDto> getListaCobros() {
        return listaCobros;
    }

    public void setListaCobros(List<LetraDto> listaCobros) {
        this.listaCobros = listaCobros;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        FinanciamientoLetraMBean.logger = logger;
    }

    public FinanciamientoManager getManagerFinanciamientoLetra() {
        return managerFinanciamientoLetra;
    }

    public void setManagerFinanciamientoLetra(FinanciamientoManager managerFinanciamientoLetra) {
        this.managerFinanciamientoLetra = managerFinanciamientoLetra;
    }

    public LetraManager getManagerLetra() {
        return managerLetra;
    }

    public void setManagerLetra(LetraManager managerLetra) {
        this.managerLetra = managerLetra;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public SelectItem[] getSiEstados() {
        siEstados = managerFinanciamientoLetra.siTiposFinanciamientoLetraTodos();
        return siEstados;
    }

    public void setSiEstados(SelectItem[] siEstados) {
        this.siEstados = siEstados;
    }

    public SelectItem[] getSiEstadosBusqueda() {
        siEstadosBusqueda = managerFinanciamientoLetra.siTiposFinanciamientoLetraTodos();
        return siEstadosBusqueda;
    }

    public void setSiEstadosBusqueda(SelectItem[] siEstadosBusqueda) {
        this.siEstadosBusqueda = siEstadosBusqueda;
    }

    public List<ParametroDto> getSiEstadosCobros() {
        return siEstadosCobros;
    }

    public void setSiEstadosCobros(List<ParametroDto> siEstadosCobros) {
        this.siEstadosCobros = siEstadosCobros;
    }

    public List<MonedaDto> getSiMonedas() throws DAOException {
        return managerMoneda.obtenerMonedasActivasPorEmpresa();
    }

    public void setSiMonedas(List<MonedaDto> siMonedas) {
        this.siMonedas = siMonedas;
    }

    public ArchivoMBean getArchivoMBean() {
        return archivoMBean;
    }

    public void setArchivoMBean(ArchivoMBean archivoMBean) {
        this.archivoMBean = archivoMBean;
    }

    public List<LetraDto> getLetrasAntiguas() {
        return letrasAntiguas;
    }

    public void setLetrasAntiguas(List<LetraDto> letrasAntiguas) {
        this.letrasAntiguas = letrasAntiguas;
    }

    public boolean isaRetencion() {
        return aRetencion;
    }

    public void setaRetencion(boolean aRetencion) {
        this.aRetencion = aRetencion;
    }

    public FinanciamientoLetraDto[] getSelectedFLs() {
        return selectedFLs;
    }

    public void setSelectedFLs(FinanciamientoLetraDto[] selectedFLs) {
        this.selectedFLs = selectedFLs;
    }

    public FinanciamientoLetra getFlExcel() {
        return flExcel;
    }

    public void setFlExcel(FinanciamientoLetra flExcel) {
        this.flExcel = flExcel;
    }

    public String getTipoXls() {
        return tipoXls;
    }

    public void setTipoXls(String tipoXls) {
        this.tipoXls = tipoXls;
    }

    public Boolean getCheckExcel() {
        return checkExcel;
    }

    public void setCheckExcel(Boolean checkExcel) {
        this.checkExcel = checkExcel;
    }
}
